概述
git rebase 是 Git 中用于重新应用提交的命令,可以将一个分支的提交历史"重新播放"到另一个分支上,从而创建一条线性的提交历史。与 git merge 不同,rebase 会改写提交历史,使项目历史更加清晰和易于理解。
什么是 Rebase?
Rebase 的字面意思是"变基",其核心思想是:将当前分支的提交"移动"到目标分支的最新提交之上,就像把当前分支的"基础"改变了一样。
直观理解
想象一下,你从 main 分支创建了 feature 分支进行开发:
main: A---B---C
\
feature: D---E使用 git rebase main 后,feature 分支的提交会被"重新应用"到 main 的最新提交 C 之上:
main: A---B---C
\
feature: D'---E'注意:D' 和 E' 是新的提交(哈希值不同),因为 rebase 会创建新的提交对象。
基本用法
基本语法
git rebase <base-branch> # 将当前分支变基到 <base-branch>常用命令
# 将当前分支变基到 main 分支
git rebase main
# 将当前分支变基到远程分支
git rebase origin/main
# 将当前分支变基到指定提交
git rebase <commit-hash>
# 继续执行 rebase(解决冲突后)
git rebase --continue
# 放弃 rebase 操作
git rebase --abort
# 跳过当前提交(交互式 rebase 中使用)
git rebase --skip工作流程示例
场景:将 feature 分支变基到 main 分支
确保当前分支是
featurebashgit checkout feature更新
main分支(获取最新代码)bashgit fetch origin git checkout main git pull origin main切换回
feature分支并执行 rebasebashgit checkout feature git rebase main处理冲突(若有)
冲突时 Git 会暂停 rebase,显示冲突文件
手动解决冲突后,标记为已解决
bashgit add <冲突文件>继续执行 rebase
bashgit rebase --continue若需放弃 rebase
bashgit rebase --abort
推送到远程仓库(如果之前已推送过)
bashgit push origin feature --force-with-lease⚠️ 注意:由于 rebase 改写了历史,需要使用
--force-with-lease强制推送(比--force更安全)
Rebase vs Merge
Merge 方式
main: A---B---C-------M
\ /
feature: D---E---/- 保留完整的分支历史
- 创建合并提交
M - 历史图可能变得复杂
Rebase 方式
main: A---B---C
\
feature: D'---E'- 创建线性的提交历史
- 不创建合并提交
- 历史更加清晰
选择建议
- 使用 Rebase:个人功能分支、希望保持历史线性、提交还未共享
- 使用 Merge:已共享的分支、需要保留分支上下文、团队约定使用 merge
常用选项
| 选项 | 说明 |
|---|---|
-i, --interactive | 启动交互式 rebase,可以编辑、删除、合并提交(下篇详细介绍) |
--continue | 解决冲突后继续执行 rebase |
--abort | 放弃当前 rebase 操作,恢复到 rebase 前的状态 |
--skip | 跳过当前提交(通常用于交互式 rebase) |
--onto <newbase> | 将提交重新应用到新的基础之上(高级用法,后续介绍) |
--no-verify | 跳过 pre-rebase 钩子 |
注意事项
不要对已共享的分支使用 rebase:
- 如果分支已经被其他人使用,rebase 会改写历史,导致协作问题
- 只对个人分支或团队约定的分支使用 rebase
已推送分支的 rebase:
- 如果分支已经推送到远程,rebase 后需要强制推送
- 使用
--force-with-lease比--force更安全,可以防止覆盖他人的提交
冲突处理:
- Rebase 过程中可能遇到多次冲突(每个提交都可能冲突)
- 需要逐个解决冲突,然后使用
git rebase --continue继续
备份重要分支:
在执行 rebase 前,可以创建备份分支:
bashgit branch feature-backup
理解提交哈希变化:
- Rebase 会创建新的提交对象,提交哈希会改变
- 这是正常现象,因为提交的父提交发生了变化
常见错误和解决方案
错误:当前分支有未提交的更改
错误信息:
error: cannot rebase: You have unstaged changes.解决方案:
# 提交更改
git commit -m "your message"
# 或暂存更改
git stash
git rebase main
git stash pop错误:rebase 过程中冲突
解决方案:
- 查看冲突文件:
git status - 手动解决冲突
- 标记为已解决:
git add <文件> - 继续 rebase:
git rebase --continue
错误:想放弃 rebase
解决方案:
git rebase --abort # 恢复到 rebase 前的状态应用场景
- 保持分支历史线性:在合并到主分支前,将功能分支变基到最新主分支,保持历史清晰
- 整理提交历史:在推送前整理本地提交,使历史更加整洁
- 同步远程更新:将本地分支变基到远程分支的最新提交上
- 准备代码审查:在提交 PR 前,使用 rebase 确保提交历史清晰
小结
git rebase 是 Git 中强大的分支管理工具,核心价值在于创建线性的提交历史,使项目历史更加清晰。初次使用时建议在个人分支上练习,理解其工作原理后再在实际项目中使用。记住:不要对已共享的分支使用 rebase,这是使用 rebase 最重要的原则。
下一篇文章将介绍交互式 rebase,让你能够更精细地控制提交历史。